// string
// number
// boolean
// bigint
// symbol
// null
// undefined
// src/ts/index.ts

// 所以可以任意改变类型
let foo;
foo = 1; // 1
foo = true; // true

console.log(foo);

const name: string = "1616";
function getFirstWord(msg: string) {
  console.log(msg.split(" ")[0]);
}

// 字符串数组
const strs: string[] = ["Hello Worl", ""];
const boolList: Array<string> = [];

// 这个时候会认为是 any[] 或者 never[] 类型
const nums = [];

// 这个时候再 push 一个 number 数据进去，也不会使其成为 number[]
nums.push(1);

//对象定义
// type UserItem = {
// ...
// };

//对象定义二
interface UserItem {
  // ...  name: string
  name: string;
  age?: number; //可选属性
  city: string;
  friendList?: UserItem[];
}

// 这里继承了 UserItem 的所有属性类型，并追加了一个权限等级属性,继承时候还可以去掉一些属性
interface Admin extends Omit<UserItem, "name"> {
  permissionLevel: number;
}

// 在声明变量的时候将其关联到类型上
const petter: UserItem = {
  name: "Petter",
  city: "郑州",
  friendList: [
    {
      name: "孙子",
      city: "子列表",
    },
  ],
};

const adminList: Admin = {
  city: "继承的城市",
  permissionLevel: 2,
};

// 定义一个类
class Human {
  // constructor 上的数据需要先这样定好类型
  name: string;
  //tips:如果定义了不适用也不行
  age: string;

  // 入参也要定义类型
  constructor(userName: string, age: string) {
    this.name = userName;
    this.age = age;
  }

  getName() {
    console.log(this.name);
  }
}

// 通过 new 这个类得到的变量，它的类型就是这个类
const human: Human = new Human("human66", "36");
// human.getName();

//联合类型
const userName: string | number = 666;

function a(age1: number, age: number = 0): number {
  return age1 + age;
}

function sayInfo(age1: number, age: number): void {
  //提前终止也可以使用void
  return;
  console.log(age, age1);
}

// 注意这里的返回值类型,异步函数
function queryData(): Promise<string> {
  return new Promise((resolve) => {
    setTimeout(() => {
      resolve("Hello World");
    }, 3000);
  });
}

// queryData().then((data) => console.log(data));

// 这一次用了函数重载
// function greet(name: string): string; // TS 类型
// function greet(name: string[]): string[]; // TS 类型
// function greet(name: string | string[]) {
//   if (Array.isArray(name)) {
//     return name.map((n) => `Welcome, ${n}!`);
//   }
//   return `Welcome, ${name}!`;
// }

// 单个问候语，此时只有一个类型 string
// const greeting = greet("Petter");
// console.log(greeting); // Welcome, Petter!

// 多个问候语，此时只有一个类型 string[]
// const greetings = greet(["Petter", "Tom", "Jimmy"]);
// console.log(greetings);

// sayInfo(8, 9);
// console.log(a(66));
// console.log(userName);
// console.log(adminList);
// console.log(petter);
// console.log(nums);
// console.log(strs);
// getFirstWord("Hello World");

// getFirstWord("123");
// console.log(name);
// getFirstWord(123);
